package it.polimi.traveldream.ejb.bean;

import it.polimi.authentication.ejb.usermanagement.Hotel;
import it.polimi.authentication.ejb.usermanagement.ListaMezzo;
import it.polimi.authentication.ejb.usermanagement.MezzoDiTrasporto;
import it.polimi.authentication.ejb.usermanagement.PacchettoMezzo;
import it.polimi.authentication.ejb.usermanagement.dto.HotelDTO;
import it.polimi.authentication.ejb.usermanagement.dto.MezzoDTO;

import java.math.BigDecimal;
import java.sql.Time;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Session Bean implementation class UserBean
 */
@Stateless
public class RitrovaListaMezzo implements ListaMezzo{


	@PersistenceContext
    private EntityManager em;
	
	public RitrovaListaMezzo(){	
	}
	
	@Override
	public ArrayList <MezzoDTO> MezzoList(String cittaPartenza, String cittaArrivo){
		
		Query q = em.createNamedQuery("Mezzo.findMezzo").setParameter("cityP", cittaPartenza).setParameter("cityA", cittaArrivo);	
		
		List<MezzoDiTrasporto>MezzoList =(List<MezzoDiTrasporto>) q.getResultList();
		
		ArrayList<MezzoDTO> MezzoListDTO = new ArrayList<MezzoDTO>();
		
		for (int i=0; i<MezzoList.size(); i++)
		{
			MezzoDTO app = new MezzoDTO();
			app.setTipo(MezzoList.get(i).getTipo());
			app.setIdMezzo(MezzoList.get(i).getMezzo());
			app.setOraPartenza(MezzoList.get(i).getOrapartenza());
			app.setOraArrivo(MezzoList.get(i).getOraarrivo());
			app.setLuogoPartenza(MezzoList.get(i).getLuogopartenza());
			app.setLuogoArrivo(MezzoList.get(i).getLuogoarrivo());
			MezzoListDTO.add(app);
		}
		
		return MezzoListDTO;
	}
	
	
	@Override
	public ArrayList <MezzoDTO> AllMezzoList(){
		
		Query q = em.createNamedQuery("MezzoDiTrasporto.findAll");
		List<MezzoDiTrasporto>MezzoList =(List<MezzoDiTrasporto>) q.getResultList();
		ArrayList<MezzoDTO> MezzoListDTO = new ArrayList<MezzoDTO>();

		for (int i=0; i<MezzoList.size(); i++)
		{
			MezzoDTO app = new MezzoDTO();
			app.setIdMezzo(MezzoList.get(i).getMezzo());
			
			String NPA;
			NPA ="ID: "+ MezzoList.get(i).getMezzo()+ ";   Tipo: "+MezzoList.get(i).getTipo()+ ";   Partenza: "
			      +MezzoList.get(i).getLuogopartenza()+ ";   Arrivo: "+MezzoList.get(i).getLuogoarrivo();
			
			app.setTipo(NPA);
			MezzoListDTO.add(app);
		}
		
		return MezzoListDTO;	
		
	}
	
	@Override
	public ArrayList<MezzoDTO> MezzoList() {
		 
		Query q2 = em.createNamedQuery("Mezzo.findAll");	
		
		List<MezzoDiTrasporto>MezzoList =(List<MezzoDiTrasporto>) q2.getResultList();
		
		ArrayList<MezzoDTO> MezzoListDTO = new ArrayList<MezzoDTO>();
		
		for (int i=0; i<MezzoList.size(); i++)
		{
			Query q = em.createNamedQuery("Mezzo.findPrezzo").setParameter("idMezzo", MezzoList.get(i).getMezzo());
			Query qOraPartenza = em.createNamedQuery("Mezzo.findOraPartenza").setParameter("idMezzo", MezzoList.get(i).getMezzo());
			Query qOraArrivo = em.createNamedQuery("Mezzo.findOraArrivo").setParameter("idMezzo", MezzoList.get(i).getMezzo());
			BigDecimal prezzoMezzo = (BigDecimal) q.getSingleResult();
			Time oraPartenza = (Time) qOraPartenza.getSingleResult();
			Time oraArrivo = (Time) qOraArrivo.getSingleResult();
			MezzoDTO app = new MezzoDTO();
			app.setTipo(MezzoList.get(i).getTipo());
			app.setIdMezzo(MezzoList.get(i).getMezzo());
//			app.setOraPartenza(MezzoList.get(i).getOrapartenza());
//			app.setOraArrivo(MezzoList.get(i).getOraarrivo());
			app.setOraArrivo(oraArrivo);
			app.setOraPartenza(oraPartenza);
			app.setLuogoPartenza(MezzoList.get(i).getLuogopartenza());
			app.setLuogoArrivo(MezzoList.get(i).getLuogoarrivo());
//			app.setPrezzo(MezzoList.get(i).getPrezzo());
			app.setPrezzo(prezzoMezzo);
			System.out.println(app.getPrezzo() + " " + MezzoList.get(i).getPrezzo());
			MezzoListDTO.add(app);
		}
		MezzoList= new ArrayList <MezzoDiTrasporto>();
		return MezzoListDTO;
	}

	@Override
	public void applicaModificaMezzo(int idMezzo, Time oraPartenzaMezzo, Time oraArrivoMezzo,BigDecimal prezzoMezzo) {
		
		Time vecchiaOraPartenza;
		Time vecchiaOraArrivo;
		BigDecimal vecchioPrezzoMezzo;
		
		Query vecchiaOP = em.createNamedQuery("Mezzo.findOraPartenza").setParameter("idMezzo", idMezzo);
		Query vecchiaOA = em.createNamedQuery("Mezzo.findOraArrivo").setParameter("idMezzo", idMezzo);
		Query vecchioPM = em.createNamedQuery("Mezzo.findPrezzo").setParameter("idMezzo", idMezzo);
		
		vecchiaOraPartenza = (Time) vecchiaOP.getSingleResult();
		vecchiaOraArrivo = (Time) vecchiaOA.getSingleResult();
		vecchioPrezzoMezzo = (BigDecimal) vecchioPM.getSingleResult();
		
		if(oraPartenzaMezzo!=vecchiaOraPartenza && oraPartenzaMezzo!=null) em.createNativeQuery("UPDATE Mezzo_Di_Trasporto m SET m.orapartenza = '"+oraPartenzaMezzo+"' WHERE m.mezzo='"+idMezzo+"'").executeUpdate();
		if(oraArrivoMezzo!=vecchiaOraArrivo && oraArrivoMezzo!=null) em.createNativeQuery("UPDATE Mezzo_Di_Trasporto m SET m.oraarrivo = '"+oraArrivoMezzo+"' WHERE m.mezzo='"+idMezzo+"'").executeUpdate();
		
		if (prezzoMezzo!=null && prezzoMezzo!=vecchioPrezzoMezzo) {
			
				BigDecimal vecchioPrezzoPacchetto;
				BigDecimal nuovoPrezzo;
				Query vecchioP;
			
				//trova tutti i pacchetti che contengono l'hotel
			
				Query idP = em.createNamedQuery("PacchettoMezzo.findPacchetto").setParameter("idMezzo", idMezzo);
				List<PacchettoMezzo> idPacchetto = (List<PacchettoMezzo>) idP.getResultList();
			
				for(int i=0; i<idPacchetto.size();i++){
					//aggiorna i prezzi di tutti i pacchetti che contengono l'hotel
				
					nuovoPrezzo = new BigDecimal(0.00);
					//prende il prezzo del pacchetto al posto i della lista
					vecchioP = em.createNamedQuery("Pacchetto.findPrezzo").setParameter("idPacchetto", idPacchetto.get(i).getId());
					vecchioPrezzoPacchetto = (BigDecimal) vecchioP.getSingleResult();
			
					//somma per trovare il nuovo prezzo del pacchetto
					nuovoPrezzo = nuovoPrezzo.add(vecchioPrezzoPacchetto.subtract(vecchioPrezzoMezzo.subtract(prezzoMezzo)));
			
					//sostituisce il prezzo in pacchetto
					em.createQuery("UPDATE Pacchetto p SET p.prezzo ="+nuovoPrezzo+" WHERE p.id='"+idPacchetto.get(i).getId()+"'").executeUpdate();
				}
		
				//aggiorna il prezzo dell'h
				em.createNativeQuery("UPDATE Mezzo_Di_Trasporto m SET m.prezzo ='"+prezzoMezzo+"' WHERE m.mezzo='"+idMezzo+"'").executeUpdate();
		}      
	}

	@Override
	public String findCittaPartenza(int idMezzo, String cittaPacchetto) {
		Query q=em.createNamedQuery("Mezzo.findCittaPartenza").setParameter("idMezzo", idMezzo);
		return (String) q.getSingleResult();
	}
}


